package com.obligatorio.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

@Entity
@NamedQueries({
		@NamedQuery(name = "findAllUser", query = "SELECT u FROM Usuario u WHERE (u.nombre LIKE :nombre OR u.apellido LIKE :apellido) AND u.estado=:STATUS"),
		@NamedQuery(name = "findAllUsers", query = "SELECT u FROM Usuario u"),
		@NamedQuery(name = "findLogin", query = "SELECT u FROM Usuario u WHERE u.email =:EMail "
				+ "AND u.password =:PASS AND u.estado=:STATUS"),
		@NamedQuery(name = "findUserByEmail", query = "SELECT u FROM Usuario u WHERE u.email =:EMail"),
		// @NamedQuery(name = "findUserContacts", query =
		// "SELECT u FROM Usuario u WHERE u =:Usuario AND u.estado=:STATUS"),
		@NamedQuery(name = "findUserContacts", query = "SELECT u FROM Usuario u WHERE u.email !=:email AND u.estado=:STATUS order by u.apellido"),
		@NamedQuery(name = "findUser", query = "SELECT u FROM Usuario u WHERE u =:Usuario AND u.estado=:STATUS"),
		@NamedQuery(name = "findActiveUserByEmail", query = "SELECT u FROM Usuario u WHERE u.email =:email AND u.estado=:STATUS"),
		@NamedQuery(name = "findUserByCodActive", query = "SELECT u FROM Usuario u WHERE u.codeActivate =:CodeActive"),
		@NamedQuery(name = "findUserRestPass", query = "SELECT u FROM Usuario u WHERE u.email =:EMail "
				+ "AND u.nombre =:Nombre AND u.apellido =:Apellido") })
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "UsuarioId")
	private Integer id;

	@Column(nullable = false)
	private String nombre;

	@Column(nullable = false)
	private String apellido;

	@Column(nullable = true)
	private Date fechaNac;

	@Column(nullable = true)
	private String uriFoto;

	@OneToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "PaisId", nullable = true)
	private Pais pais;

	@Column(nullable = true)
	private String codPostal;

	@OneToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "SectorId", nullable = true)
	private Sector sector;

	@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
	@JoinColumn(name = "BuzonId")
	private Buzon buzon;

	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	@Column(name = "estudioId")
	private Collection<Estudios> estudios = new ArrayList<Estudios>();

	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@Column(name = "trabajoId")
	private Collection<Trabajos> trabajos = new ArrayList<Trabajos>();

	@Column(unique = true, nullable = false)
	private String email;

	@Column(nullable = false)
	private String password;

	@Enumerated(EnumType.STRING)
	private Estados estado;

	@Column(nullable = true)
	private String codeActivate;

	@Column(nullable = true)
	private String descPersonal;

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	private Collection<Contactos> contactos = new ArrayList<Contactos>();

	// Get and Seter
	public Collection<Trabajos> getTrabajos() {
		return trabajos;
	}

	public void setTrabajos(Collection<Trabajos> trabajos) {
		this.trabajos = trabajos;
	}

	public Collection<Estudios> getEstudios() {
		return estudios;
	}

	public void setEstudios(Collection<Estudios> estudios) {
		this.estudios = estudios;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public Date getFechaNac() {
		return fechaNac;
	}

	public void setFechaNac(Date fechaNac) {
		this.fechaNac = fechaNac;
	}

	public Buzon getBuzon() {
		return buzon;
	}

	public void setBuzon(Buzon buzon) {
		this.buzon = buzon;
	}

	public String getUriFoto() {
		return uriFoto;
	}

	public void setUriFoto(String uriFoto) {
		this.uriFoto = uriFoto;
	}

	public Pais getPais() {
		return pais;
	}

	public void setPais(Pais pais) {
		this.pais = pais;
	}

	public String getCodPostal() {
		return codPostal;
	}

	public void setCodPostal(String codPostal) {
		this.codPostal = codPostal;
	}

	public Sector getSector() {
		return sector;
	}

	public void setSector(Sector sector) {
		this.sector = sector;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Estados getEstado() {
		return estado;
	}

	public void setEstado(Estados estados) {
		this.estado = estados;
	}

	public String getDescPersonal() {
		return descPersonal;
	}

	public void setDescPersonal(String descPersonal) {
		this.descPersonal = descPersonal;
	}

	public String getCodeActivate() {
		return codeActivate;
	}

	public void setCodeActivate(String codeActivate) {
		this.codeActivate = codeActivate;
	}

	public Collection<Contactos> getContactos() {
		return contactos;
	}

	public void setContactos(Collection<Contactos> contacos) {
		this.contactos = contacos;
	}

	public Usuario() {
	}

	public Usuario(Integer id, String nombre, String apellido, Date fechaNac,
			String uriFoto, Pais pais, String codPostal, Sector sector,Buzon buzon, String email,
			String pass, Estados estado) {
		this.id = id;
		this.nombre = nombre;
		this.apellido = apellido;
		this.fechaNac = fechaNac;
		this.uriFoto = uriFoto;
		this.pais = pais;
		this.codPostal = codPostal;
		this.sector = sector;
		this.buzon = buzon;
		this.email = email;
		this.password = pass;
		this.estado = estado;
	}

	public Usuario(String email, String pass) {
		this.email = email;
		this.password = pass;
	}

	public Usuario(String nombre, String apellido, String email, String pass) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.email = email;
		this.password = pass;
	}

	public Usuario(String nombre, String apellido, String email, String pass,
			Estados estado) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.email = email;
		this.password = pass;
		this.estado = estado;
	}

	public Usuario(String nombre, String apellido, String email) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.email = email;
	}

	@Override
	public boolean equals(Object object) {
		if (!(object instanceof Usuario)) {
			return false;
		}
		Usuario other = (Usuario) object;
		if ((this.id == null && other.id != null)
				|| (this.id != null && !this.id.equals(other.id))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		// return getNombre()+"-"+getApellido()+"-"+getEmail();
		return getNombre() + "-" + getApellido();
	}
}
